
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Spring Boot 项目安全警报！90% 的开发者都忽略了这 15 个致命漏洞 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Spring Boot 项目安全警报！90% 的开发者都忽略了这 15 个致命漏洞 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">漏洞</div>
          <div class="card-question">什么是SQL注入漏洞？在Spring Boot中应如何有效防范？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">漏洞</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">SQL注入漏洞指当SQL语句通过字符串拼接构建时，攻击者可输入恶意代码（如 'admin' OR '1'='1'）来绕过验证或操纵数据库。有效的防范方法是始终使用JPA或MyBatis等框架提供的参数化查询功能。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「1. SQL 注入漏洞（SQL Injection）」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">漏洞</div>
          <div class="card-question">什么是XSS（跨站脚本攻击）？文档中建议使用什么方案来解决该问题？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">漏洞</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">XSS攻击是指当应用未正确处理用户输入的HTML代码时，攻击者可以插入恶意脚本。解决方案是使用Spring Security自带的XSS过滤器，并通过引入`org.owasp.encoder`依赖，使用`Encode.forHtml(userInput)`对用户输入进行编码。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「2. XSS（跨站脚本攻击）」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">不当的CORS配置会带来什么安全风险？正确的配置策略是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不当的CORS配置会导致任何网站都可以通过JavaScript访问你的API数据，从而引发数据泄露风险。正确的策略是配置CORS规则，只允许特定的、受信任的域名（allowedOrigins）访问API。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「3. CORS 配置不当，任意网站能访问你的 API」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">配置</div>
          <div class="card-question">Spring Boot Actuator的端点若不加保护会暴露什么风险？文档提供了哪两种加固方法？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">配置</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">不安全的Actuator端点（如`/actuator/env`）会暴露应用的配置信息和环境变量。加固方法有两种：1. 在配置文件中通过`management.endpoints.web.exposure.include`属性只暴露必要的端点（如health, info）。2. 使用Spring Security对`/actuator/**`路径进行保护，要求用户具有特定角色（如ADMIN）才能访问。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「4. 不安全的 Actuator 端点」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">漏洞</div>
          <div class="card-question">服务器文件路径遍历漏洞是如何产生的？文档中提供了一个怎样的简单防御代码示例？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">漏洞</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">该漏洞产生于应用允许用户通过构造包含'..'等字符的路径（如`../../etc/passwd`）来访问服务器上的任意文件。一个简单的防御方法是检查用户输入，如果包含 '..' 或以 '/' 开头，就抛出安全异常，拒绝访问。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「5. 服务器文件路径遍历漏洞」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">最佳实践</div>
          <div class="card-question">为防止JWT Token被滥用导致用户身份伪造，应遵循哪三项核心安全实践？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">最佳实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">为确保JWT Token的安全，应遵循三项实践：1. 使用强随机密钥（至少256位）；2. 不要在JWT的Payload中存放任何敏感信息；3. 必须设置合理的Token过期时间。</div>
          </div>
          <div class="card-source">来源: 文档中「2. Spring Boot 最致命的 15 个漏洞及解决方案」章节下的「6. JWT Token 处理不当，用户身份可伪造」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">最佳实践</div>
          <div class="card-question">根据文档的安全最佳实践清单，防范SQL注入的首要原则是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">最佳实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">永远不要通过拼接字符串来构建SQL语句，必须坚持使用参数化查询。</div>
          </div>
          <div class="card-source">来源: 文档中「3. 如何让你的 Spring Boot 应用更安全？」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">最佳实践</div>
          <div class="card-question">文档中提到，哪一项措施可以有效防范约80%的攻击？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">最佳实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">开启Spring Security。其提供的默认安全配置已经能够有效防范大部分常见的攻击。</div>
          </div>
          <div class="card-source">来源: 文档中「3. 如何让你的 Spring Boot 应用更安全？」部分</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">最佳实践</div>
          <div class="card-question">除了代码层面的防御，在应用维护层面，有什么重要的安全措施？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">最佳实践</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">定期升级Spring Boot的版本。这能够帮助开发者及时修复框架本身已知的安全漏洞，保持应用的安全性。</div>
          </div>
          <div class="card-source">来源: 文档中「3. 如何让你的 Spring Boot 应用更安全？」部分</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
